package com.demo.core.model.support;

import java.util.Date;

import com.demo.common.NumberUtils;
import com.demo.search.annotation.SearchableId;
import com.demo.search.annotation.SearchableProperty;

/**
 * 以代理主键作为主键形式的基础POJO模型
 * 
 * 提供一般模型所需要的属性ID (代理主键、创建者、创建时间、修改者、修改时间等)
 * 为Cache和提高HashMap效率,重写HashCode方法
 * <p>一个需要注意的问题:</p>
 * <pre>
 * 	当使用泛型Long替代主键类型时,使用ORM(如:iBatis)取得主键,ORM无法确定主键类型,
 *  则使用DB类型进行判断, 出现java.match.BigInteger类型,而非java.lang.Long。
 *  两个解决办法:1.不使用泛型,ORM层可以通过反射来确定主键类型
 *             2.ORM层确定映射对象类型
 * </pre>
 * <font color="red">※  字段属性类型:protected。子类方便访问(特别是子类使用注解形式对变量进行访问)</font>
 * @author ryuu.kk
 *
 */
public abstract class SimpleBaseModel implements java.io.Serializable {

	/**
	 * 版本序列化ID
	 */
	private static final long serialVersionUID = -960011632687473059L;
	
	/**
	 * 代理主键Long
	 */
	@SearchableId(name="id")
	protected Long pk;
	
	/**
	 * 创建用户
	 */
	protected Long createUser;
	
	/**
	 * 创建时间
	 */
	@SearchableProperty
	protected Date createDate;
	
	/**
	 * 修改用户
	 */
	protected Long modifyUser;
	
	/**
	 * 修改时间
	 */
	@SearchableProperty
	protected Date modifyDate;
	
	/**
	 * 备注
	 */
	protected String notes;

	public Long getId() {
		return pk;
	}
	public void setId(Long pk) {
		this.pk = pk;
	}
	
	/**
	 * ID的16进制字符串形式
	 * @return String 
	 */
	public String getSsid() {
		Long id = getId();
		if (id != null) {
			return Long.toString(id, 16);
			//return NumberUtils.toUnsignedString(id, 64);
		}
		return "";
	}
	
	/**
	 * 设置ID
	 * 将16进制字符串转换为Long
	 * @param ssid String
	 */
	public void setSsid(String ssid) {
		setId(Long.parseLong(ssid, 16));
	}
	
	public Long getCreateUser() {
		return createUser;
	}

	public void setCreateUser(Long createUser) {
		this.createUser = createUser;
	}

	public Date getCreateDate() {
		return createDate;
	}

	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}

	public Long getModifyUser() {
		return modifyUser;
	}

	public void setModifyUser(Long modifyUser) {
		this.modifyUser = modifyUser;
	}

	public Date getModifyDate() {
		return modifyDate;
	}

	public void setModifyDate(Date modifyDate) {
		this.modifyDate = modifyDate;
	}

	public String getNotes() {
		return notes;
	}

	public void setNotes(String notes) {
		this.notes = notes;
	}
	
	@Override
	public int hashCode() {
		int code = 31;
		//code ^= getClass().getName().hashCode();
		code ^= pk == null ? 0 : pk.hashCode();
		return code;
	}
}
